#pragma once
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>

#define SIXTY_FOUR_BITS 64
#define MAX_TABLE_SIZE (1 << 16)

typedef struct hash_table_s {
    uint16_t loaded_size;
    uint32_t table_size;
    uint64_t bitmap[MAX_TABLE_SIZE / SIXTY_FOUR_BITS];
    size_t element_size;
    void *table;
    uint16_t (*hash_func)(void *value);
} hash_table_t;


hash_table_t *HashTable_NewTable(const size_t element_size, uint16_t (*hash_func)(void *value));

void HashTable_DestroyTable(hash_table_t *hash_table);

bool HashTable_IsValueInTable(hash_table_t *hash_table, void *value);

bool HashTable_InsertValueToTable(hash_table_t *hash_table, void *value);
